package Test1;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//实现接口
interface Subject {
    void action();
}

//被代理类
class RealSubject implements Subject {
    @Override
    public void action() {
        System.out.println("我是被代理类。");
    }
}

//动态代理类
class MyInvocationHandler implements InvocationHandler {

    Object obj; //实现了接口的被代理类的对象的声明

    //1、给被代理类的对象实例化
    //2、返回一个代理类的对象
    public Object blind(Object obj){
        this.obj = obj;
        //obj.getClass().getClassLoader()获取类的加载器
        //obj.getClass().getInterfaces()获取类实现的接口
        //this 谁实现的InvocationHandler接口的对象
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("代理开始");
        Object val = method.invoke(obj, args);//invoke就是执行的意思，执行method方法
        System.out.println("代理结束");
        return val;
    }
}

//测试类
public class TestDemo {
    public static void main(String[] args) {
        MyInvocationHandler Handler = new MyInvocationHandler(); //创建一个经纪人
        RealSubject subject = new RealSubject();//创建一个明星
        Object o = Handler.blind(subject);//将明星和经纪人进行绑定  ；并且返回一个已经绑定明星的经纪人
        System.out.println(o);
        Subject sub = (Subject)o;
        sub.action();

//        UserDAOImpl user = new UserDAOImpl();
//        Object blind = Handler.blind(user);
//        UserDAO userDAO = (UserDAO) blind;
//        String s = userDAO.insert("张三", 20);
//        System.out.println(s);

    }
}
